home *** CD-ROM | disk | FTP | other *** search
/ Aminet 32 / Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso / Aminet / dev / lang / Python152.lha / Python-1.5 / Demo / metaclasses / meta-vladimir.txt < prev    next >
Text File  |  1998-08-10  |  12KB  |  257 lines

  1. Subject: Re: The metaclass saga using Python
  2. From: Vladimir Marangozov <Vladimir.Marangozov@imag.fr>
  3. To: tim_one@email.msn.com (Tim Peters)
  4. Cc: python-list@cwi.nl
  5. Date: Wed, 5 Aug 1998 15:59:06 +0200 (DFT)
  6.  
  7. [Tim]
  8. > building-on-examples-tends-to-prevent-abstract-thrashing-ly y'rs  - tim
  9.  
  10. OK, I stand corrected. I understand that anybody's interpretation of
  11. the meta-class concept is likely to be difficult to digest by others.
  12.  
  13. Here's another try, expressing the same thing, but using the Python
  14. programming model, examples and, perhaps, more popular terms.
  15.  
  16. 1. Classes.
  17.  
  18.    This is pure Python of today. Sorry about the tutorial, but it is
  19.    meant to illustrate the second part, which is the one we're
  20.    interested in and which will follow the same development scenario.
  21.    Besides, newbies are likely to understand that the discussion is
  22.    affordable even for them :-)
  23.  
  24.    a) Class definition
  25.  
  26.       A class is meant to define the common properties of a set of objects.
  27.       A class is a "package" of properties. The assembly of properties
  28.       in a class package is sometimes called a class structure (which isn't
  29.       always appropriate).
  30.  
  31.       >>> class A:
  32.               attr1 = "Hello"                  # an attribute of A
  33.               def method1(self, *args): pass   # method1 of A
  34.               def method2(self, *args): pass   # method2 of A
  35.       >>>
  36.  
  37.       So far, we defined the structure of the class A. The class A is
  38.       of type <class>. We can check this by asking Python: "what is A?"
  39.  
  40.       >>> A                                # What is A?
  41.       <class __main__.A at 2023e360>
  42.  
  43.    b) Class instantiation
  44.  
  45.       Creating an object with the properties defined in the class A is
  46.       called instantiation of the class A. After an instantiation of A, we
  47.       obtain a new object, called an instance, which has the properties
  48.       packaged in the class A.
  49.  
  50.       >>> a = A()                          # 'a' is the 1st instance of A 
  51.       >>> a                                # What is 'a'? 
  52.       <__main__.A instance at 2022b9d0>
  53.  
  54.       >>> b = A()                          # 'b' is another instance of A
  55.       >>> b                                # What is 'b'?
  56.       <__main__.A instance at 2022b9c0>
  57.  
  58.       The objects, 'a' and 'b', are of type <instance> and they both have
  59.       the same properties. Note, that 'a' and 'b' are different objects.
  60.       (their adresses differ). This is a bit hard to see, so let's ask Python:
  61.  
  62.       >>> a == b                           # Is 'a' the same object as 'b'?
  63.       0                                    # No.
  64.  
  65.       Instance objects have one more special property, indicating the class
  66.       they are an instance of. This property is named __class__.
  67.  
  68.       >>> a.__class__                      # What is the class of 'a'?
  69.       <class __main__.A at 2023e360>       # 'a' is an instance of A
  70.       >>> b.__class__                      # What is the class of 'b'?
  71.       <class __main__.A at 2023e360>       # 'b' is an instance of A
  72.       >>> a.__class__ == b.__class__       # Is it really the same class A?
  73.       1                                    # Yes.
  74.  
  75.    c) Class inheritance (class composition and specialization)
  76.  
  77.       Classes can be defined in terms of other existing classes (and only
  78.       classes! -- don't bug me on this now). Thus, we can compose property
  79.       packages and create new ones. We reuse the property set defined
  80.       in a class by defining a new class, which "inherits" from the former.
  81.       In other words, a class B which inherits from the class A, inherits
  82.       the properties defined in A, or, B inherits the structure of A.
  83.  
  84.       In the same time, at the definition of the new class B, we can enrich
  85.       the inherited set of properties by adding new ones and/or modify some
  86.       of the inherited properties.
  87.       
  88.       >>> class B(A):                          # B inherits A's properties
  89.               attr2 = "World"                  # additional attr2
  90.               def method2(self, arg1): pass    # method2 is redefined
  91.               def method3(self, *args): pass   # additional method3
  92.  
  93.       >>> B                                 # What is B?
  94.       <class __main__.B at 2023e500>
  95.       >>> B == A                            # Is B the same class as A?
  96.       0                                     # No.
  97.  
  98.       Classes define one special property, indicating whether a class
  99.       inherits the properties of another class. This property is called
  100.       __bases__ and it contains a list (a tuple) of the classes the new
  101.       class inherits from. The classes from which a class is inheriting the
  102.       properties are called superclasses (in Python, we call them also --
  103.       base classes).
  104.  
  105.       >>> A.__bases__                       # Does A have any superclasses?
  106.       ()                                    # No.
  107.       >>> B.__bases__                       # Does B have any superclasses?
  108.       (<class __main__.A at 2023e360>,)     # Yes. It has one superclass.
  109.       >>> B.__bases__[0] == A               # Is it really the class A?
  110.       1                                     # Yes, it is.
  111.  
  112. --------
  113.  
  114.    Congratulations on getting this far! This was the hard part.
  115.    Now, let's continue with the easy one.
  116.  
  117. --------
  118.  
  119. 2. Meta-classes
  120.  
  121.    You have to admit, that an anonymous group of Python wizards are
  122.    not satisfied with the property packaging facilities presented above.
  123.    They say, that the Real-World bugs them with problems that cannot be
  124.    modelled successfully with classes. Or, that the way classes are
  125.    implemented in Python and the way classes and instances behave at
  126.    runtime isn't always appropriate for reproducing the Real-World's
  127.    behavior in a way that satisfies them.
  128.  
  129.    Hence, what they want is the following:
  130.  
  131.       a) leave objects as they are (instances of classes)
  132.       b) leave classes as they are (property packages and object creators)
  133.  
  134.    BUT, at the same time:
  135.  
  136.       c) consider classes as being instances of mysterious objects.
  137.       d) label mysterious objects "meta-classes".
  138.  
  139.    Easy, eh?
  140.  
  141.    You may ask: "Why on earth do they want to do that?".
  142.    They answer: "Poor soul... Go and see how cruel the Real-World is!".
  143.    You - fuzzy: "OK, will do!"
  144.  
  145.    And here we go for another round of what I said in section 1 -- Classes.
  146.  
  147.    However, be warned! The features we're going to talk about aren't fully
  148.    implemented yet, because the Real-World don't let wizards to evaluate
  149.    precisely how cruel it is, so the features are still highly-experimental.
  150.  
  151.    a) Meta-class definition
  152.  
  153.       A meta-class is meant to define the common properties of a set of
  154.       classes.  A meta-class is a "package" of properties. The assembly
  155.       of properties in a meta-class package is sometimes called a meta-class
  156.       structure (which isn't always appropriate).
  157.  
  158.       In Python, a meta-class definition would have looked like this:
  159.  
  160.       >>> metaclass M:
  161.               attr1 = "Hello"                  # an attribute of M
  162.               def method1(self, *args): pass   # method1 of M
  163.               def method2(self, *args): pass   # method2 of M
  164.       >>>
  165.  
  166.       So far, we defined the structure of the meta-class M. The meta-class
  167.       M is of type <metaclass>. We cannot check this by asking Python, but
  168.       if we could, it would have answered:
  169.  
  170.       >>> M                                # What is M?
  171.       <metaclass __main__.M at 2023e4e0>
  172.  
  173.    b) Meta-class instantiation
  174.  
  175.       Creating an object with the properties defined in the meta-class M is
  176.       called instantiation of the meta-class M. After an instantiation of M,
  177.       we obtain a new object, called an class, but now it is called also
  178.       a meta-instance, which has the properties packaged in the meta-class M.
  179.  
  180.       In Python, instantiating a meta-class would have looked like this:
  181.  
  182.       >>> A = M()                          # 'A' is the 1st instance of M
  183.       >>> A                                # What is 'A'?
  184.       <class __main__.A at 2022b9d0>
  185.  
  186.       >>> B = M()                          # 'B' is another instance of M
  187.       >>> B                                # What is 'B'?
  188.       <class __main__.B at 2022b9c0>
  189.  
  190.       The metaclass-instances, A and B, are of type <class> and they both
  191.       have the same properties. Note, that A and B are different objects.
  192.       (their adresses differ). This is a bit hard to see, but if it was
  193.       possible to ask Python, it would have answered:
  194.  
  195.       >>> A == B                           # Is A the same class as B?
  196.       0                                    # No.
  197.  
  198.       Class objects have one more special property, indicating the meta-class
  199.       they are an instance of. This property is named __metaclass__.
  200.  
  201.       >>> A.__metaclass__                  # What is the meta-class of A?
  202.       <metaclass __main__.M at 2023e4e0>   # A is an instance of M
  203.       >>> A.__metaclass__                  # What is the meta-class of B?
  204.       <metaclass __main__.M at 2023e4e0>   # B is an instance of M
  205.       >>> A.__metaclass__ == B.__metaclass__  # Is it the same meta-class M?
  206.       1                                    # Yes.
  207.  
  208.    c) Meta-class inheritance (meta-class composition and specialization)
  209.  
  210.       Meta-classes can be defined in terms of other existing meta-classes
  211.       (and only meta-classes!). Thus, we can compose property packages and
  212.       create new ones. We reuse the property set defined in a meta-class by
  213.       defining a new meta-class, which "inherits" from the former.
  214.       In other words, a meta-class N which inherits from the meta-class M,
  215.       inherits the properties defined in M, or, N inherits the structure of M.
  216.  
  217.       In the same time, at the definition of the new meta-class N, we can
  218.       enrich the inherited set of properties by adding new ones and/or modify
  219.       some of the inherited properties.
  220.  
  221.       >>> metaclass N(M):                      # N inherits M's properties
  222.               attr2 = "World"                  # additional attr2
  223.               def method2(self, arg1): pass    # method2 is redefined
  224.               def method3(self, *args): pass   # additional method3
  225.  
  226.       >>> N                              # What is N?
  227.       <metaclass __main__.N at 2023e500>
  228.       >>> N == M                         # Is N the same meta-class as M?
  229.       0                                  # No.
  230.  
  231.       Meta-classes define one special property, indicating whether a
  232.       meta-class inherits the properties of another meta-class. This property
  233.       is called __metabases__ and it contains a list (a tuple) of the
  234.       meta-classes the new meta-class inherits from. The meta-classes from
  235.       which a meta-class is inheriting the properties are called
  236.       super-meta-classes (in Python, we call them also -- super meta-bases).
  237.  
  238.       >>> M.__metabases__                # Does M have any supermetaclasses?
  239.       ()                                 # No.
  240.       >>> N.__metabases__                # Does N have any supermetaclasses?
  241.       (<metaclass __main__.M at 2023e360>,)  # Yes. It has a supermetaclass.
  242.       >>> N.__metabases__[0] == M        # Is it really the meta-class M?
  243.       1                                  # Yes, it is.
  244.  
  245. --------
  246.  
  247.    Triple congratulations on getting this far!
  248.    Now you know everything about meta-classes and the Real-World!
  249.  
  250. <unless-wizards-want-meta-classes-be-instances-of-mysterious-objects!>
  251.  
  252. -- 
  253.        Vladimir MARANGOZOV          | Vladimir.Marangozov@inrialpes.fr
  254. http://sirac.inrialpes.fr/~marangoz | tel:(+33-4)76615277 fax:76615252
  255.